/*
* 通过extends关键字继承了Parent类所有的属性和方法。
* 子类的constructor方法 和 toString方法中都出现了super关键字,
* 在这里表示父类的构造函数，用来新建父类的this对象。
* 子类必须在constructor方法中调用super方法，因为子类的this对象必须通过父类的构造函数完成创建，
* 并且得到与父类同样的实例属性和方法。如果不调用，子类就得不到this对象，就不能进行二次加工。
* 要注意的一个地方是，在子类的构造函数中，只有调用super才可以使用this关键字，
* 所以this关键字要放到super关键字之后，
* 是因为子类实例的构建，基于父类实例，只有super方法能调用父类实例。
*
* 如果在一个方法前，加上static关键字，就表示该方法不会被实例继承，而是直接通过类来调用，这就称为“静态方法”。
* 父类的静态方法，可以被子类继承,可以通过子类直接调用，但不会被子类实例继承,即不可以通过子类实例调用
* 如果静态方法包含this关键字，这个this指的是类，而不是实例
* 静态方法也是可以从super对象上调用的。
* 静态属性可以被继承，可以在子类访问，但不会被实例访问
*/
/*
* ES5的继承实质是先创建子类的实例对象this，然后再将父类的方法添加到this上面(Parent.apply(this))
* ES6的继承实质是先将父类实例对象的属性和方法加到this上面(所以需先调用super方法)，然后再用子类构造函数修改this
*/


class Parent {

    constructor(x,y){
        this.x = x;
        this.y = y;

    }
    toString(){
        console.log("x:"+this.x+" y:"+this.y)
    }


    static staticMethod(){
        this.baz() //static baz 而不是baz  如果静态方法包含this关键字，这个this指的是类，而不是实例
        console.log('静态方法');
    }
    static baz() {
        console.log('static baz');
    }
    baz() {
        console.log('baz');
    }
}
//Parent的静态属性
Parent.prop = "Parent-prop";


class Child extends Parent{

    constructor(x,y,color){
        super(x,y);
        this.color = color;
    }
    toString(){
        return super.toString();
    }
    static childStaticMethod() {
        //静态方法也是可以从super对象上调用的
        return super.staticMethod();
    }
}



var c = new Child(1,2)
c.toString()


//静态属性可以被继承,通过子类访问
console.log(Child.prop); // Parent-prop
//但静态属性不会被子类实例访问
console.log(c.prop); // undefined


//静态方法被子类继承
Child.staticMethod()
//静态方法也是可以从super对象上调用的
Child.childStaticMethod()



var p = new Parent()
//静态属性不会被实例
console.log(p.prop); // undefined
//静态方法不会被实例继承
// p.staticMethod() // p.staticMethod is not a function
// c.staticMethod() // c.staticMethod is not a function

